package controlador;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.sql.SQLException;
import bean.Periodos;
import bean.Veritrade;
import delegate.GestionProcesos;
import recursos.LeerExcel;
import recursos.Sesion;
import servicio.PeriodosService;
import servicio.VeritradeService;
import util.Conexion;
import ventanas.IFImportarVeritrade;

public class ImportarVeritradeController implements ActionListener {

	IFImportarVeritrade ifVeritrade;
	VeritradeService servicioVeritrade = GestionProcesos.getVeritradeService();
	PeriodosService servicioPeriodos = GestionProcesos.getPeriodosService();

	public ImportarVeritradeController(IFImportarVeritrade ifVeritrade) {
		this.ifVeritrade = ifVeritrade;
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == ifVeritrade.getBtnGuardar()) {
			Thread hGuardar = new Thread() {
				public void run() {
					guardar();
				}
			};	
			hGuardar.start();
		}
		if (e.getSource() == ifVeritrade.getBtnCancelar()) {
			cancelar();
		}
		if (e.getSource() == ifVeritrade.getBtnImportar()) {
			importar();
		}
	}

	private void importar() {
		String msjError = "";
		if (ifVeritrade.getEjercicio().equals("")) {
			msjError += "-Ingrese ejercicio\n";
		}
		if (ifVeritrade.getPeriodo().equals("")) {
			msjError += "-Ingrese periodo\n";
		}
		if (ifVeritrade.getTipo().equals("")) {
			msjError += "-Seleccione tipo";
		}
		if (msjError.equals("")) {
			ifVeritrade.desactivaCampos();
			Periodos obj = new Periodos();
			obj.setEjercicio(Integer.parseInt(ifVeritrade.getEjercicio()));
			obj.setPeriodo(ifVeritrade.getPeriodo());
			obj.setTipo_informacion(ifVeritrade.getTipo());
			obj.setFlag(2);
			obj.setUsuario(Sesion.usuario);
			boolean estado = false;
			int situacion = 0;
			try {
				Periodos periodos = servicioPeriodos.obtenerPeriodo(obj);
				if (periodos != null) {
					if(periodos.getFlag()==0){
						estado = true;
					}else if(periodos.getFlag()==1){
						estado = false;
						situacion=1;
					}else if(periodos.getFlag()==2){
						estado = true;
					}
				} 
				if(estado==false){
					String directorio = Sesion.directorio_vt
							+ ifVeritrade.getEjercicio() + "\\";
					String archivo = ifVeritrade.getEjercicio()
							+ ifVeritrade.getPeriodo()
							+ ifVeritrade.getTipo();
					String xls = ".xls";
					String xlsx = ".xlsx";
					String ruta1 = directorio + archivo + xls;
					String ruta2 = directorio + archivo + xlsx;
					File file1 = new File(ruta1);
					File file2 = new File(ruta2);
					if (file1.exists()) {
						if(situacion==0){
							servicioPeriodos.insertar(obj);
							Conexion.commitTransacction();
						}else{
							servicioPeriodos.actualizar(obj);
							Conexion.commitTransacction();
						}
						ifVeritrade.limpiarTabla();
						new LeerExcel(file1, ifVeritrade.getModelo());
						ifVeritrade.setResultadoBusqueda(ifVeritrade.getTabla().getRowCount());
						ifVeritrade.activaControles();
					} else if (file2.exists()) {
						if(situacion==0){
							servicioPeriodos.insertar(obj);
							Conexion.commitTransacction();
						}else{
							servicioPeriodos.actualizar(obj);
							Conexion.commitTransacction();
						}
						ifVeritrade.limpiarTabla();
						new LeerExcel(file2, ifVeritrade.getModelo());
						ifVeritrade.setResultadoBusqueda(ifVeritrade.getTabla().getRowCount());
						ifVeritrade.activaControles();
					} else {
						Conexion.commitTransacction();
						ifVeritrade.activaCampos();
						Sesion.mensajeError(
								ifVeritrade,
								"El archvio excel: "
										+ archivo
										+ " \nno se encontro en el directorio:\n "
										+ directorio
										+ "\nPor favor verifique.");
					}
				}else{
					Conexion.commitTransacction();
					ifVeritrade.activaCampos();
					if(periodos.getFlag()==0){
						Sesion.mensajeInformacion(ifVeritrade, "El periodo se ha cerrado por el usuario: "+periodos.getUsuario());
					}else if(periodos.getFlag()==2){
						Sesion.mensajeInformacion(ifVeritrade, "El periodo esta siendo trabajado por el usuario: "+periodos.getUsuario());
					}
				}
			} catch (SQLException e) {
				e.printStackTrace();
				Sesion.mensajeError(ifVeritrade, "Mensaje: "+e.getMessage()+
						"\nCausa: "+e.getCause()+
						"\nCodigo Error:"+e.getErrorCode());
				cancelar();
			} catch(OutOfMemoryError e){
				cancelar();
				e.printStackTrace();
				Sesion.mensajeError(ifVeritrade, "Mensaje: "+e.getMessage()+
						"\nCausa: "+e.getCause());
			}
			catch (Exception e) {
				cancelar();
				e.printStackTrace();
				Sesion.mensajeError(ifVeritrade, "Mensaje: "+e.getMessage()+
						"\nCausa: "+e.getCause());
			}
		}else {
			Sesion.mensajeError(ifVeritrade, msjError);
		}
	}

	private void cancelar() {
		Periodos obj = new Periodos();
		obj.setEjercicio(Integer.parseInt(ifVeritrade.getEjercicio()));
		obj.setPeriodo(ifVeritrade.getPeriodo());
		obj.setTipo_informacion(ifVeritrade.getTipo());
		obj.setFlag(1);
		obj.setUsuario(Sesion.usuario);
		try {
			//System.out.println(Conexion.obtenerConexionMSQL().getTransactionIsolation());
			servicioPeriodos.actualizar(obj);
			Conexion.commitTransacction();
			ifVeritrade.limpiar();
			ifVeritrade.activaCampos();
			ifVeritrade.desactivaControles();
		} catch (SQLException e) {
			ifVeritrade.activaCampos();
			ifVeritrade.desactivaControles();
			e.printStackTrace();
			Sesion.mensajeError(ifVeritrade, "Mensaje: "+e.getMessage()+
											"\nCausa: "+e.getCause()+
											"\nCodigo Error:"+e.getErrorCode());
			Conexion.commitTransacction();
		}catch (Exception e) {
			ifVeritrade.activaCampos();
			ifVeritrade.desactivaControles();
			Conexion.commitTransacction();
			e.printStackTrace();
			Sesion.mensajeError(ifVeritrade, "Mensaje: "+e.getMessage()+
											"\nCausa: "+e.getCause());
		}
	}

	private void guardar() {
		if (ifVeritrade.getTabla().getRowCount() > 0) {
			for (int i = 0; i < ifVeritrade.getTabla().getRowCount(); i++) {
				Veritrade veritrade = new Veritrade();
				veritrade.setEjercicio(Integer.parseInt(ifVeritrade
						.getEjercicio()));
				veritrade.setPeriodo(ifVeritrade.getPeriodo());
				veritrade.setTipo_informacion(ifVeritrade.getTipo());
				veritrade.setHTS_Code(ifVeritrade.getTabla()
						.getValueAt(i, 1).toString());
				veritrade.setHTS_Code_Description(ifVeritrade.getTabla()
						.getValueAt(i, 2).toString());
				veritrade.setCustom(ifVeritrade.getTabla().getValueAt(i, 3)
						.toString());
				veritrade.setDUA(ifVeritrade.getTabla().getValueAt(i, 4)
						.toString());
				veritrade.setDate(ifVeritrade.getTabla()
						.getValueAt(i, 5).toString());
				veritrade.setETA(ifVeritrade.getTabla()
						.getValueAt(i, 6).toString());
				veritrade.setBL_No(ifVeritrade.getTabla().getValueAt(i, 7)
						.toString());
				veritrade.setTax_ID(ifVeritrade.getTabla()
						.getValueAt(i, 8).toString());
				veritrade.setImporter(ifVeritrade.getTabla().getValueAt(i, 9)
						.toString());
				veritrade.setExporter(ifVeritrade.getTabla().getValueAt(i, 10)
						.toString());
				veritrade.setGross_kg(Double.parseDouble(ifVeritrade.getTabla()
						.getValueAt(i, 11).toString()));
				veritrade.setNet_kg(Double.parseDouble(ifVeritrade.getTabla()
						.getValueAt(i, 12).toString()));
				veritrade.setQty_1(Double.parseDouble(ifVeritrade.getTabla()
						.getValueAt(i, 13).toString()));
				veritrade.setUnit_1(ifVeritrade.getTabla().getValueAt(i, 14)
						.toString());
				veritrade.setQty_2(Double.parseDouble(ifVeritrade.getTabla()
						.getValueAt(i, 15).toString()));
				veritrade.setUnit_2(ifVeritrade.getTabla().getValueAt(i, 16)
						.toString());
				veritrade.setU$_FOB_Tot(Double.parseDouble(ifVeritrade.getTabla()
						.getValueAt(i, 17).toString()));
				veritrade.setU$_Freight_Tot(Double.parseDouble(ifVeritrade
						.getTabla().getValueAt(i, 18).toString()));
				veritrade.setU$_CFR_Tot(Double.parseDouble(ifVeritrade.getTabla()
						.getValueAt(i, 19).toString()));
				veritrade.setU$_Insurance_Tot(Double.parseDouble(ifVeritrade
						.getTabla().getValueAt(i, 20).toString()));
				veritrade.setU$_CIF_Tot(Double.parseDouble(ifVeritrade.getTabla()
						.getValueAt(i, 21).toString()));
				veritrade.setU$_FOB_Unit_1(Double.parseDouble(ifVeritrade
						.getTabla().getValueAt(i, 22).toString()));
				veritrade.setU$_CFR_Unit_1(Double.parseDouble(ifVeritrade
						.getTabla().getValueAt(i, 23).toString()));
				veritrade.setU$_CIF_Unit_1(Double.parseDouble(ifVeritrade
						.getTabla().getValueAt(i, 24).toString()));
				veritrade.setU$_CIF__Taxes_Unit_1(Double.parseDouble(ifVeritrade
						.getTabla().getValueAt(i, 25).toString()));
				veritrade.setU$_FOB_Unit_2(Double.parseDouble(ifVeritrade
						.getTabla().getValueAt(i, 26).toString()));
				veritrade.setU$_CFR_Unit_2(Double.parseDouble(ifVeritrade
						.getTabla().getValueAt(i, 27).toString()));
				veritrade.setU$_CIF_Unit_2(Double.parseDouble(ifVeritrade
						.getTabla().getValueAt(i, 28).toString()));
				veritrade.setU$_CIF__Taxes_Unit_2(Double.parseDouble(ifVeritrade
						.getTabla().getValueAt(i, 29).toString()));
				veritrade.setOrigin_Country(ifVeritrade.getTabla()
						.getValueAt(i, 30).toString());
				veritrade.setLoading_Country(ifVeritrade.getTabla()
						.getValueAt(i, 31).toString());
				veritrade.setLoading_Port(ifVeritrade.getTabla()
						.getValueAt(i, 32).toString());
				veritrade.setVia(ifVeritrade.getTabla().getValueAt(i, 33)
						.toString());
				veritrade.setTransport(ifVeritrade.getTabla().getValueAt(i, 34)
						.toString());
				veritrade.setCustom1(ifVeritrade.getTabla().getValueAt(i, 35)
						.toString());
				veritrade.setBank(ifVeritrade.getTabla().getValueAt(i, 36)
						.toString());
				veritrade.setWarehouse(ifVeritrade.getTabla().getValueAt(i, 37)
						.toString());
				veritrade.setStatus(ifVeritrade.getTabla().getValueAt(i, 38)
						.toString());
				veritrade.setCommercial_Description(ifVeritrade.getTabla()
						.getValueAt(i, 39).toString().replace(" ", ""));
				veritrade.setUsuario_creacion(Sesion.usuario);
				veritrade.setFecha_creacion(Sesion.fechaActualNumerica());
				try {
					servicioVeritrade.insertar(veritrade);
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
			Periodos obj = new Periodos();
			obj.setEjercicio(Integer.parseInt(ifVeritrade.getEjercicio()));
			obj.setPeriodo(ifVeritrade.getPeriodo());
			obj.setTipo_informacion(ifVeritrade.getTipo());
			obj.setFlag(0);
			obj.setUsuario(Sesion.usuario);
			try {
				servicioPeriodos.actualizar(obj);
				Conexion.commitTransacction();
				
			} catch (SQLException e) {
				ifVeritrade.activaCampos();
				ifVeritrade.desactivaControles();
				e.printStackTrace();
			} finally{
				ifVeritrade.limpiar();
				ifVeritrade.activaCampos();
				ifVeritrade.desactivaControles();
			}
			Sesion.mensajeInformacion(ifVeritrade, "El proceso termino correctamente");
		} else {
			ifVeritrade.activaCampos();
			ifVeritrade.desactivaControles();
			Sesion.mensajeError(ifVeritrade,
					"No hay datos en la tabla que registrar");
		}
	}
}
